import requests
import pandas as pd
from bs4 import BeautifulSoup
import csv
import openpyxl
import matplotlib.pyplot as plt
# 设置中文支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
import seaborn as sns

# 指定要爬取的网页地址
url = "https://www.ukpass.org/ranking/index-2-53-0.html"

# 获取网页内容
response = requests.get(url)
html_content = response.content

# 解析网页内容
soup = BeautifulSoup(html_content, 'html.parser')
table = soup.find('table')

# 定义新的表头
header = ['年份2023', '学校名称', '总分', 'H指数', '学术声誉', '雇主声誉', '论文引用率', '免费评估']

# 将表格数据写入csv文件
with open('《卫报》2023法律专业排名.csv', mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(header)
    for row in table.find_all('tr')[1:]:
        row_data = [cell.text.strip() for cell in row.find_all(['th', 'td'])]
        writer.writerow(row_data)

print('已将表格数据写入 《卫报》2023法律专业排名.csv 文件')

# 将表格数据写入excel文件
workbook = openpyxl.Workbook()
worksheet = workbook.active
worksheet.append(header)
for row in table.find_all('tr')[1:]:
    row_data = [cell.text.strip() for cell in row.find_all(['th', 'td'])]
    worksheet.append(row_data)

workbook.save('《卫报》2023法律专业排名.xlsx')
print('已将表格数据写入 《卫报》2023法律专业排名.xlsx 文件')

# 绘制条形图-使用条形图可视化各大学总分的排名情况
df_csv = pd.read_csv('《卫报》2023法律专业排名.csv', encoding='utf-8', index_col=False)
df_csv['总分'] = pd.to_numeric(df_csv['总分'], errors='coerce')
df_csv.sort_values(by='总分', ascending=False, inplace=True)
# 密度图（KDEplot）
plt.figure(figsize=(10, 6))
sns.kdeplot(df_csv['总分'], shade=True)
plt.title('各大学总分密度图')
plt.xlabel('总分')
plt.ylabel('密度')
plt.tight_layout()
plt.savefig('各大学总分密度图.png')
plt.show()
df_csv = pd.read_csv('《卫报》2023法律专业排名.csv', encoding='utf-8', index_col=False).head(20)

plt.figure(figsize=(10, 6))
sns.barplot(x='总分', y='学校名称', data=df_csv)
plt.title('各大学总分排名')
plt.xlabel('总分')
plt.ylabel('学校名称')
plt.tight_layout()
plt.savefig('各大学总分排名条形图.png')
plt.show()

# 绘制折线图-使用折线图可视化各大学H指数的排名情况
df_csv['H指数'] = pd.to_numeric(df_csv['H指数'], errors='coerce')
df_csv.sort_values(by='H指数', ascending=False, inplace=True)

plt.figure(figsize=(10, 6))
plt.plot(df_csv['H指数'], df_csv['学校名称'], marker='o')
plt.title('各大学H指数排名')
plt.xlabel('H指数')
plt.ylabel('学校名称')
plt.tight_layout()
plt.savefig('各大学H指数排名折线图.png')
plt.show()


